[Home] Python으로 돌아가기

천안 시간대별 기온 레포트

📘 문제

천안 지역의 오늘 시간대별 기온을 기상청 API를 통해 수집하고, 이를 시각화하여 HTML 레포트로 구성하시오.

🛠️ 절차

  1. 기상청 초단기예보 API를 사용하여 천안 지역의 시간대별 기온 데이터를 수집한다.
  2. 수집한 데이터를 기반으로 시간대별 기온 그래프를 생성한다.
  3. 문제, 절차, 해답을 포함한 HTML 레포트를 작성한다.

✅ 해답

다음은 파이썬을 사용하여 기상청 API로부터 데이터를 수집하고, matplotlib를 이용하여 시간대별 기온 그래프를 생성하는 코드이다.


import requests
import json
from datetime import datetime, timedelta
import matplotlib.pyplot as plt

# 1. 기상청 격자 좌표 및 사용자 설정
service_key = 'LYSVNDnABGDZt2945mz2PugF7jTBjzTmpAkxucNUkQy+x/USojRFJm2zo4NEVklq3CSNBDPy/ydnFIQBZz9EnA=='
nx, ny = 66, 106  # 천안의 격자 좌표

# 2. 날짜 및 시간 설정 (가용성을 위해 한 시간 이전의 시간 사용)
now = datetime.now()
base_date = now.strftime('%Y%m%d')
base_hour = (now - timedelta(hours=1)).strftime('%H') + "30"

# 3. 요청 URL 및 파라미터 설정
url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst'
params = {
    'serviceKey': service_key,        # 서비스 키
    'numOfRows': '1000',              # 최대 데이터 수
    'pageNo': '1',                    # 페이지 번호
    'dataType': 'JSON',               # 데이터 형식
    'base_date': base_date,           # 기준 날짜
    'base_time': base_hour,           # 기준 시간
    'nx': nx,                         # X 좌표
    'ny': ny                          # Y 좌표
}

# 4. API 요청 및 응답 상태 확인
response = requests.get(url, params=params)
print("응답 상태 코드:", response.status_code)

# 5. JSON 응답 디코딩
try:
    data = response.json()
except json.JSONDecodeError:
    print("⚠️ JSON 디코딩 실패")
    print("응답 내용:", response.text)
    exit()

# 6. 데이터 구조 접근
try:
    items = data['response']['body']['items']['item']
except KeyError:
    print("⚠️ 예보 데이터 접근 실패")
    print("받은 JSON:", json.dumps(data, indent=2, ensure_ascii=False))
    exit()

# 7. 기온(T1H) 데이터만 추출
times = []
temps = []
for item in items:
    if item['category'] == 'T1H':
        times.append(item['fcstTime'])                    # 예보 시간
        temps.append(float(item['fcstValue']))            # 기온 값

# 8. 기온 데이터 유무 확인
if not temps:
    print("⚠️ 기온 데이터가 존재하지 않음")
    exit()

# 9. 그래프 시각화 (영문 레이블 사용)
plt.figure(figsize=(10, 5))
plt.plot(times, temps, marker='o')
plt.title('Hourly Temperature in Cheonan')
plt.xlabel('Time (HHMM)')
plt.ylabel('Temperature (°C)')
plt.grid(True)
plt.savefig('cheonan_temperature.png')  # 그래프 이미지로 저장
plt.show()  # 화면에 그래프 표시
plt.close()
print("✅ 그래프 저장 완료: cheonan_temperature.png")
    

위 코드를 실행하면 다음과 같은 시간대별 기온 그래프가 생성된다.

천안 시간대별 기온 그래프